【网络连接】socket

认知

当实现不同服务器之间的通讯时,可以认为每个服务器的连接是通过一个or多个路由连接(感觉就像是一个中枢神经连接多个神经元),由路由进行分配,而TP/TCP定义了分配的原则,而socket是实现具体的操作(类似开关,决定连接的闭合)。

socket的本质是一个文件,其通过I/O操作,即打开文件--读写文件--关闭文件,实现数据or通讯的传递,其是基于Unix/Linux通信的。

函数

socket(int domain, int type, int protocol)

功能:打开创建一个连接关系

domain(family):协议域(协议族),主要决定socket的地址类型,理解就是通信的场景

  • AF_INET(默认)服务器之间的网络通信
  • AF_INET6:IPV6
  • AF_LOCAL
  • AF_UNIX:只能用于单一的unix的进程间的通信

type:指定socket类型,理解是数据传输的类型

  • SOCK_STREAM(默认)流式,TCP
  • SOCK_DGRAM:数据报式,UDP
  • SOCK_RAW:原始套接字
  • SOCK_PACKET:
  • SOCK_SEQPACKET:可靠的连接数据报服务

protocol:指定协议,和type一起决定

  • IPPROTO_TCP
  • IPPTOTO_UDP
  • IPPROTO_SCTP
  • IPPROTO_TIPC

注:

  1. TCP发送数据时,已经建立好连接,无需指定地址;UDP每次发送指令都需要确定好发送给谁
  2. 建立连接时,type和protocol的组合不是随机的,而是固定的,protocol默认为0,按照type的选择决定适合的选择
  3. 创建socket,并未定义其具体的地址,必须通过bind函数赋予地址,而端口可以指定,也可以又系统随机分配

bind((host, port))

对象:服务端

功能:用于服务端绑定到地址,即服务器启动时,将该服务器绑定到一个固定的地址提供服务,客户可以通过访问这个地址来调用服务。这个地址的构成是 ip地址+端口

listen(backlog)

对象:服务端

功能:开始监听socket

backlog:操作系统可以最多进行几次连接操作,当超过这个次数,操作系统连接失败

accept()

对象:服务端

功能:在确定服务器开始监听某个特定地址后,接受TCP并获取客户端的地址,实现一个完整的建立。之后网络之间可以开始进行I/O操作了。

connect((host,port)) / connect_ex((host, port))

对象:客户端

功能:客户端可以连接到指定的服务器,包含 ip地址+端口

注:connect_ex((host, port))功能相同,但是在连接成功时返回0,否则返回errorno

recv(bufsize[,flag])

对象:服务端、客户端

功能:实现接收数据的操作~~

s.send(string[,flag])

对象:服务端、客户端

功能:实现发送数据的操作,返回值是发送数据的字节数量,可能会小于string的字节大小~~

详见链接:https://blog.csdn.net/rebelqsp/article/details/22109925

results matching ""

    No results matching ""